从Linux系统磁盘空间不足引发的Zabbix服务器数据库迁移 |
您所在的位置:网站首页 › 腾讯会议 磁盘空间不足 › 从Linux系统磁盘空间不足引发的Zabbix服务器数据库迁移 |
之前一直没有去关心Zabbbix服务器存储空间问题,最近Zabbix报警提示/根目录磁盘空间不足,于是登录Zabbix看了一下,发现根目录只有1.3MB了,这怎么办了?第一个想到的是扩展根目录,结果发现不是用的LVM,采用的是标准的,心想也还可以救,就和Windows一样将D盘、E盘删除,再将D盘的空间扩展给C盘就OK啊,于是开始着手操作(注意提前备份虚拟机,最好做一个快照,出问题了好恢复) [root@zabbixserver /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.8G 9.8G 1.3M 100% / /dev/sda5 6.2G 33M 6.1G 1% /home /dev/sda1 197M 143M 55M 73% /boot查看文件系统,我需要扩展的是sda2,也就是说我需要删除sda3、sda4、sda5来扩展sda2,发现这是不太可能的,因为需要扩展sda2需要umount /dev/sda2再去扩展来解决,而系统盘是不能够umount的,会提示设备忙。看来这个方案被推翻的(因为我只知道通过这一种方式来进行扩展标准类型的磁盘,也许有其它好的方法我不知道的。) [root@zabbixserver /]# fdisk -l 磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节磁盘标签类型:dos 磁盘标识符:0x0003dc46 设备 Boot Start End Blocks Id System /dev/sda1 * 2048 411647 204800 83 Linux /dev/sda2 411648 20891647 10240000 83 Linux /dev/sda3 20891648 29083647 4096000 82 Linux swap / Solaris /dev/sda4 29083648 41943039 6429696 5 Extended /dev/sda5 29085696 41943039 6428672 83 Linux现在磁盘扩容不了,看来只能够检测是哪个文件占用空间比较大,然后再从这个文件上下手解决问题了,通过检测到现是/var/lib/mysql/下的libdata1文件过大已经达到了6.7G(检测方法:du -sh /*,再逐步检测即可),我立即想到了zabbix的数据库的原因。 [root@zabbixserver mysql]# ls -lh 总用量 6.7G -rw-rw----. 1 mysql mysql 16K 12月 1 14:15 aria_log.00000001 -rw-rw----. 1 mysql mysql 52 12月 1 14:15 aria_log_control -rw-rw----. 1 mysql mysql 6.7G 12月 29 14:24 ibdata1 -rw-rw----. 1 mysql mysql 5.0M 12月 29 14:24 ib_logfile0 -rw-rw----. 1 mysql mysql 5.0M 12月 29 14:21 ib_logfile1 drwx------. 2 mysql mysql 4.0K 11月 16 17:10 mysql srwxrwxrwx 1 mysql mysql 0 12月 29 13:45 mysql.sock drwx------. 2 mysql mysql 4.0K 11月 16 17:10 performance_schema drwx------. 2 mysql mysql 8.0K 11月 16 17:17 zabbix_db随后谷歌发现zabbix的数据库它的表模式是共享表空间模式,随着数据增长ibdata1会越来越大,性能方面也会有影响,而且innodb把数据和索引都放在ibdata1下。 共享表空间模式: InnoDB 默认会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中:ibdata1,增删数据库的时候ibdata1文件不会自动收缩,单个数据库的备份也将成为问题。通常只能将数据使用mysqldump 导出,然后再导入解决这个问题。 独立表空间模式: 优点: 1、每个表都有自已独立的表空间。 2、每个表的数据和索引都会存在自已的表空间中。 3、可以实现单表在不同的数据库中移动。 4、空间可以回收(drop/truncate table方式操作表空间不能自动回收) 5、对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。 缺点: 单表增加比共享空间方式更大。 结论: 共享表空间在Insert操作上有一些优势,但在其它都没独立表空间表现好,所以我们要改成独立表空间。当启用独立表空间时,需要调整innodb_open_files参数。 但是这里还有一个问题,就是就算我们将现在的空间调整出来了,但是因为我们的根目录本身只有10G,后面数据库大了,还是会出现这种情况,所以我们还是得调整数据库,将它存放的位置移除根目录,同时调整为独立表空间,来一劳永逸的解决这个问题。 首先先在虚拟机上添加一个100G的磁盘,然后对这个磁盘分区,再将这个磁盘挂载到/ZabbixDB目录,再备份数据库,迁移数据库存放位置至ZabbixDB目录,然后修改数据库为独立表空间模式,再还原数据库即可; 1、添加磁盘并格式化磁盘 [root@zabbix_server /]# fdisk /dev/sdb [root@zabbix_server /]# mkfs.xfs -f /dev/sdb1 [root@zabbix_server /]# fdisk -l 磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0xabdf27bd 设备 Boot Start End Blocks Id System /dev/sdb1 2048 209715199 104856576 83 Linux2、挂载磁盘并设置开机自动挂载 [root@zabbix_server /]# mkdir /ZabbixDB [root@zabbix_server /]# mount /dev/sdb1 /ZabbixDB [root@zabbix_server /]# vi /etc/fstab [root@zabbix_server /]# /dev/sdb1 /ZabbixDB xfs default 1 23、备份数据库 因为现在的数据库比较大,我们先查看一下哪些表的历史数据比较多 MariaDB [zabbix_db]> select table_name, (data_length+index_length)/1024/1024 as total_mb, table_rows from information_schema.tables where table_schema='zabbix_db'; +----------------------------+---------------+------------+ | table_name | total_mb | table_rows | +----------------------------+---------------+------------+ | events | 116.76562500 | 904289 | | history | 555.81250000 | 7038124 | | history_uint | 5674.50000000 | 59219866 | | trends | 46.57812500 | 581682 | | trends_uint | 270.95312500 | 2228048 | +----------------------------+---------------+------------+ 113 rows in set (0.05 sec)可以看到history和history_uint这两个表的历史数据最多。 另外就是trends,trends_uint中也存在一些数据。 由于数据量太大,按照普通的方式delete数据的话基本上不太可能。 所以决定直接采用truncate table的方式来快速清空这些表的数据,再使用mysqldump导出数据,删除共享表空间数据文件,重新导入数据。 2)停止相关服务,避免写入数据 [root@zabbix_server /]# systemctl stop zabbix-server [root@zabbix_server /]# systemctl stop httpd3)清空历史数据 [root@zabbix_server /]# mysql -uroot -p mysql > use zabbix; Database changed mysql > truncate table history; Query OK, 123981681 rows affected (0.23 sec) mysql > optimize table history; 1 row in set (0.02 sec) mysql > truncate table history_uint; Query OK, 57990562 rows affected (0.12 sec) mysql > optimize table history_uint; 1 row in set (0.03 sec)4)备份数据库 [root@zabbix_server /]# mysqldump -uroot -p zabbix_db > /home/zabbix_db.sql5)停止数据库并删除共享表空间数据文件 [root@zabbix_server /]# systecmtl stop mariadb [root@zabbix_server /]# cd /var/lib/mysql [root@zabbix_server /]# rm -rf ib*4、迁移数据库存放位置 [root@zabbix_server /]# mkdir /ZabbixDB/DB [root@zabbix_server /]# chown -vR mysql:mysql /ZabbixDB/DB [root@zabbix_server /]# chmod -vR 700 /etc/ZabbixDB/DB [root@zabbix_server /]# cp -av /var/lib/mysql* /ZabbixDB/DB [root@zabbix_server /]# vi /etc/my.cnf [mysqld] #可以修改InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间。 innodb_file_per_table=1 #修改数据库存放目录 datadir=/ZabbixDB/DB/mysql socket=/var/lib/mysql/mysql.sock再启动数据库服务 [root@zabbix_server /]# systemctl start mariadb启动服务以后,我们需要检测一下独立表空间的功能是否已经正常开启,当为ON时说明已经开启 [root@zabbix_server /]#mysql -u root -p MariaDB [(none)]> show variables like '%per_table%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set (0.00 sec)5、还原数据库 [root@zabbix_server /]# mysqldump -uroot -p zabbix |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |